Global settings

Clear work space and set global variables

# Clear memory
rm(list=ls()) # Clear environmental variables
gc() # memory garbage removal
          used  (Mb) gc trigger  (Mb) limit (Mb) max used  (Mb)
Ncells 4207633 224.8    7824414 417.9         NA  6840728 365.4
Vcells 7827112  59.8   14786712 112.9      16384 12513660  95.5
# set global options
knitr::opts_chunk$set(fig.width=12, fig.height=8, warning=FALSE, message=FALSE)

Load libaries

if(!require("pacman", quietly=T)) install.packages("pacman")
pacman::p_load(osfr,tinytex,tidyverse,keyring,knitr,readxl,data.table,colorspace, lpSolve,irr,here,lme4,broom,psych,zoo,units,ggdist,cowplot,ggcorrplot,dplyr, patchwork, cowplot, ggpmisc, forcats, pwr, ggpmisc, simstudy, explore, car,VIM,mice,flextable,here, remotes,magrittr,reshape2,descr,table1,tableone,gmodels,xtable,lavaan,corrplot,caret,corrgram,Hmisc,polycor,lavaan,kableExtra,DiagrammeR,grid,Gmisc,epitools)

Set up local tempfolder for raw and processed data files

# Get the path to the session's temporary directory
session_temp_dir <- tempdir()

# Define paths for the specific temporary subdirectories
raw_data_dir <- file.path(session_temp_dir, "raw_data")
processed_data_dir <- file.path(session_temp_dir, "processed_data")

# Create the 'raw_data' subdirectory if it doesn't exist
if (!dir.exists(raw_data_dir)) {
  dir.create(raw_data_dir)
}

# Create the 'processed_data' subdirectory if it doesn't exist
if (!dir.exists(processed_data_dir)) {
  dir.create(processed_data_dir)
}

 

Authenticate R to OSF connection

osf_auth(keyring :: key_get("osf"))
Registered PAT from the provided token

OSF nodes


# Define OSF node IDs at the beginning
# raw_data_node_id <- "yxsqb"   # Master Thesis Raw Data Node or other Raw Data Node
# raw_data_node_id <- "gpj2v"  # https://osf.io/gpj2v/ Quantify Occupational Injury
 raw_data_node_id <- "dpgby"  # https://osf.io/dpgby/ Art Business Education
# raw_data_node_id <- "z6jfn" # https://osf.io/z6jfn/ Housing prices
# raw_data_node_id <- "gu7ny" # https://osf.io/gu7ny/ Hmm53a-2425-GR1
# raw_data_node_id <- "prw4a" # https://osf.io/prw4a/ Hmm53a-2425-GR2
# raw_data_node_id <- "gxw3v" # https://osf.io/gxw3v/ Hmm53a-2425-GR3

# processed_data_node_id <- "e4rdh"  # Master Thesis Processed Data Node 
# processed_data_node_id <- "q4wgm"  # https://osf.io/q4wgm/ Quantify Occupational Injury
 processed_data_node_id <- "akgf2"  # https://osf.io/akgf2/ Art Business Education
# processed_data_node_id <- "6heqg"  # https://osf.io/6heqg/ Housing prices
# processed_data_node_id <- "76tn5"  # https://osf.io/76tn5/ Hmm53a-2425-GR1
# processed_data_node_id <- "ab6hg"  # https://osf.io/ab6hg/ Hmm53a-2425-GR2
# processed_data_node_id <- "tyhbk"  # https://osf.io/tyhbk/ Hmm53a-2425-GR3 

Download Zotero_tag_export_long.csv


osf_retrieve_node(processed_data_node_id) %>%
  osf_ls_files(pattern = "Zotero_tag_export_long.csv") %>%
   osf_download(path = raw_data_dir, conflicts="overwrite",progress=TRUE)

Load Zotero tag export file into R data frame


csv_file <- list.files(path = raw_data_dir, pattern = "\\.csv$", full.names = TRUE)

if (length(csv_file) == 0) {
  stop("Error: No csv file found in the specified directory.")
}



# standard pathname
csv_file[1] <- file.path(dirname(csv_file[1]), basename(csv_file[1]))
if (!file.exists(csv_file[1])) {
  stop("File does not exist. Check the path.")
}

print(csv_file)
[1] "/var/folders/v0/q9_by2r90yqg0g8s8rykvby40000gn/T//RtmplVKZdG/raw_data/Zotero_tag_export_long.csv"

Select first CSV file

# Read the Markdown file
Zotero_tag_export_long <- read.csv(csv_file[1], encoding = "UTF-8")

# Check if the file is empty
if (length(Zotero_tag_export_long) == 0) {
  stop("Error: The csv file is empty.")
}

own coding


Zotero_tag_export_long <- Zotero_tag_export_long %>%
  # Remove backslashes from the 'tag' column
  mutate(tag = gsub("\\\\", "", tag)) %>%
  # Update the annotation column by combining existing annotation, comment (if applicable), and page info
  mutate(annotation = str_squish(
    paste(
      if_else(is.na(annotation), "", annotation),
      if_else(comment != "No Comment", comment, ""),
      paste0("(p.", page, ")")
    )
  )) %>%
  # Remove the redundant page and comment columns
  select(-page, -comment)

# View the updated dataframe
print(Zotero_tag_export_long)
NA
NA

Zotero_SynthesisTable <- Zotero_tag_export_long %>%
  pivot_wider(
    id_cols = c(title, author),
    names_from = tag,
    values_from = annotation,
    values_fn = function(x) {
      if(length(x) == 1) {
        x
      } else {
        paste0('"', paste(x, collapse = '" "'), '"')
      }
    }
  ) %>%
  select(title, author, everything())

# View the transformed dataframe
print(Zotero_SynthesisTable)
NA
storage and cleaning

Upload Zotero tag export long data file to OSF

Save Zotero tag export long data frame to local processed_data_dir folder


# Define the full path for the output CSV file
output_file <- file.path(processed_data_dir, "Zotero_SynthesisTable.csv")

write.csv(Zotero_SynthesisTable,output_file,row.names=FALSE)

Upload Zotero tag export long file from local processed_data_dir to folder to OSF

Housekeeping

Delete files in local temp folder

Delete local directories

# Delete the raw_data_dir directory and its contents
# unlink(file.path(tempdir(), "raw_data_dir"), recursive = TRUE)
unlink(raw_data_dir, recursive = TRUE)

# Delete the processed_data_dir directory and its contents
# unlink(file.path(tempdir(), "processed_data_dir"), recursive = TRUE)
unlink(processed_data_dir, recursive = TRUE)
LS0tCnRpdGxlOiAiU3RlcCAyIC0gQ3JlYXRlIFN5bnRoZXNpc3RhYmxlIGZyb20gWm90ZXJvIGV4cG9ydCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBab3Rlcm9fdGFnX2V4cG9ydF9sb25nX3ByaW50OiBwYWdlZAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6CiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgKLS0tCgojIEdsb2JhbCBzZXR0aW5ncwoKIyMgQ2xlYXIgd29yayBzcGFjZSBhbmQgc2V0IGdsb2JhbCB2YXJpYWJsZXMKYGBge3IgZ2xvYmFsLW9wdGlvbnN9CiMgQ2xlYXIgbWVtb3J5CnJtKGxpc3Q9bHMoKSkgIyBDbGVhciBlbnZpcm9ubWVudGFsIHZhcmlhYmxlcwpnYygpICMgbWVtb3J5IGdhcmJhZ2UgcmVtb3ZhbAojIHNldCBnbG9iYWwgb3B0aW9ucwprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTgsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UpCgpgYGAKCiMjIExvYWQgbGliYXJpZXMgCmBgYHtyIGxvYWQtcGFja2FnZXN9CmlmKCFyZXF1aXJlKCJwYWNtYW4iLCBxdWlldGx5PVQpKSBpbnN0YWxsLnBhY2thZ2VzKCJwYWNtYW4iKQpwYWNtYW46OnBfbG9hZChvc2ZyLHRpbnl0ZXgsdGlkeXZlcnNlLGtleXJpbmcsa25pdHIscmVhZHhsLGRhdGEudGFibGUsY29sb3JzcGFjZSwgbHBTb2x2ZSxpcnIsaGVyZSxsbWU0LGJyb29tLHBzeWNoLHpvbyx1bml0cyxnZ2Rpc3QsY293cGxvdCxnZ2NvcnJwbG90LGRwbHlyLCBwYXRjaHdvcmssIGNvd3Bsb3QsIGdncG1pc2MsIGZvcmNhdHMsIHB3ciwgZ2dwbWlzYywgc2ltc3R1ZHksIGV4cGxvcmUsIGNhcixWSU0sbWljZSxmbGV4dGFibGUsaGVyZSwgcmVtb3RlcyxtYWdyaXR0cixyZXNoYXBlMixkZXNjcix0YWJsZTEsdGFibGVvbmUsZ21vZGVscyx4dGFibGUsbGF2YWFuLGNvcnJwbG90LGNhcmV0LGNvcnJncmFtLEhtaXNjLHBvbHljb3IsbGF2YWFuLGthYmxlRXh0cmEsRGlhZ3JhbW1lUixncmlkLEdtaXNjLGVwaXRvb2xzKQpgYGAKCgojIyBTZXQgdXAgbG9jYWwgdGVtcGZvbGRlciBmb3IgcmF3IGFuZCBwcm9jZXNzZWQgZGF0YSBmaWxlcwpgYGB7ciBsb2NhbC10ZW1wZm9sZGVyfQojIEdldCB0aGUgcGF0aCB0byB0aGUgc2Vzc2lvbidzIHRlbXBvcmFyeSBkaXJlY3RvcnkKc2Vzc2lvbl90ZW1wX2RpciA8LSB0ZW1wZGlyKCkKCiMgRGVmaW5lIHBhdGhzIGZvciB0aGUgc3BlY2lmaWMgdGVtcG9yYXJ5IHN1YmRpcmVjdG9yaWVzCnJhd19kYXRhX2RpciA8LSBmaWxlLnBhdGgoc2Vzc2lvbl90ZW1wX2RpciwgInJhd19kYXRhIikKcHJvY2Vzc2VkX2RhdGFfZGlyIDwtIGZpbGUucGF0aChzZXNzaW9uX3RlbXBfZGlyLCAicHJvY2Vzc2VkX2RhdGEiKQoKIyBDcmVhdGUgdGhlICdyYXdfZGF0YScgc3ViZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QKaWYgKCFkaXIuZXhpc3RzKHJhd19kYXRhX2RpcikpIHsKICBkaXIuY3JlYXRlKHJhd19kYXRhX2RpcikKfQoKIyBDcmVhdGUgdGhlICdwcm9jZXNzZWRfZGF0YScgc3ViZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QKaWYgKCFkaXIuZXhpc3RzKHByb2Nlc3NlZF9kYXRhX2RpcikpIHsKICBkaXIuY3JlYXRlKHByb2Nlc3NlZF9kYXRhX2RpcikKfQoKIApgYGAKCiMjIEF1dGhlbnRpY2F0ZSBSIHRvIE9TRiBjb25uZWN0aW9uCmBgYHtyIG9zZi1hdXRoZW50aWNhdGlvbn0Kb3NmX2F1dGgoa2V5cmluZyA6OiBrZXlfZ2V0KCJvc2YiKSkKYGBgCiMjIE9TRiBub2RlcwpgYGB7ciBPU0Ytbm9kZXN9CgojIERlZmluZSBPU0Ygbm9kZSBJRHMgYXQgdGhlIGJlZ2lubmluZwojIHJhd19kYXRhX25vZGVfaWQgPC0gInl4c3FiIiAgICMgTWFzdGVyIFRoZXNpcyBSYXcgRGF0YSBOb2RlIG9yIG90aGVyIFJhdyBEYXRhIE5vZGUKIyByYXdfZGF0YV9ub2RlX2lkIDwtICJncGoydiIgICMgaHR0cHM6Ly9vc2YuaW8vZ3BqMnYvIFF1YW50aWZ5IE9jY3VwYXRpb25hbCBJbmp1cnkKIHJhd19kYXRhX25vZGVfaWQgPC0gImRwZ2J5IiAgIyBodHRwczovL29zZi5pby9kcGdieS8gQXJ0IEJ1c2luZXNzIEVkdWNhdGlvbgojIHJhd19kYXRhX25vZGVfaWQgPC0gIno2amZuIiAjIGh0dHBzOi8vb3NmLmlvL3o2amZuLyBIb3VzaW5nIHByaWNlcwojIHJhd19kYXRhX25vZGVfaWQgPC0gImd1N255IiAjIGh0dHBzOi8vb3NmLmlvL2d1N255LyBIbW01M2EtMjQyNS1HUjEKIyByYXdfZGF0YV9ub2RlX2lkIDwtICJwcnc0YSIgIyBodHRwczovL29zZi5pby9wcnc0YS8gSG1tNTNhLTI0MjUtR1IyCiMgcmF3X2RhdGFfbm9kZV9pZCA8LSAiZ3h3M3YiICMgaHR0cHM6Ly9vc2YuaW8vZ3h3M3YvIEhtbTUzYS0yNDI1LUdSMwoKIyBwcm9jZXNzZWRfZGF0YV9ub2RlX2lkIDwtICJlNHJkaCIgICMgTWFzdGVyIFRoZXNpcyBQcm9jZXNzZWQgRGF0YSBOb2RlIAojIHByb2Nlc3NlZF9kYXRhX25vZGVfaWQgPC0gInE0d2dtIiAgIyBodHRwczovL29zZi5pby9xNHdnbS8gUXVhbnRpZnkgT2NjdXBhdGlvbmFsIEluanVyeQogcHJvY2Vzc2VkX2RhdGFfbm9kZV9pZCA8LSAiYWtnZjIiICAjIGh0dHBzOi8vb3NmLmlvL2FrZ2YyLyBBcnQgQnVzaW5lc3MgRWR1Y2F0aW9uCiMgcHJvY2Vzc2VkX2RhdGFfbm9kZV9pZCA8LSAiNmhlcWciICAjIGh0dHBzOi8vb3NmLmlvLzZoZXFnLyBIb3VzaW5nIHByaWNlcwojIHByb2Nlc3NlZF9kYXRhX25vZGVfaWQgPC0gIjc2dG41IiAgIyBodHRwczovL29zZi5pby83NnRuNS8gSG1tNTNhLTI0MjUtR1IxCiMgcHJvY2Vzc2VkX2RhdGFfbm9kZV9pZCA8LSAiYWI2aGciICAjIGh0dHBzOi8vb3NmLmlvL2FiNmhnLyBIbW01M2EtMjQyNS1HUjIKIyBwcm9jZXNzZWRfZGF0YV9ub2RlX2lkIDwtICJ0eWhiayIgICMgaHR0cHM6Ly9vc2YuaW8vdHloYmsvIEhtbTUzYS0yNDI1LUdSMyAKYGBgCgojIERvd25sb2FkIFpvdGVyb190YWdfZXhwb3J0X2xvbmcuY3N2IApgYGB7ciBnZXQtcHJvY2Vzc2VkLWRhdGEtb3NmLCBlY2hvPVRSVUUsIGluY2x1ZGU9VFJVRSwgcmVzdWx0cz0naGlkZSd9Cgpvc2ZfcmV0cmlldmVfbm9kZShwcm9jZXNzZWRfZGF0YV9ub2RlX2lkKSAlPiUKICBvc2ZfbHNfZmlsZXMocGF0dGVybiA9ICJab3Rlcm9fdGFnX2V4cG9ydF9sb25nLmNzdiIpICU+JQogICBvc2ZfZG93bmxvYWQocGF0aCA9IHJhd19kYXRhX2RpciwgY29uZmxpY3RzPSJvdmVyd3JpdGUiLHByb2dyZXNzPVRSVUUpCmBgYAoKIyMgTG9hZCBab3Rlcm8gdGFnIGV4cG9ydCBmaWxlIGludG8gUiBkYXRhIGZyYW1lCmBgYHtyIGxpc3QtY3N2LWZpbGVzfQoKY3N2X2ZpbGUgPC0gbGlzdC5maWxlcyhwYXRoID0gcmF3X2RhdGFfZGlyLCBwYXR0ZXJuID0gIlxcLmNzdiQiLCBmdWxsLm5hbWVzID0gVFJVRSkKCmlmIChsZW5ndGgoY3N2X2ZpbGUpID09IDApIHsKICBzdG9wKCJFcnJvcjogTm8gY3N2IGZpbGUgZm91bmQgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuIikKfQoKCgojIHN0YW5kYXJkIHBhdGhuYW1lCmNzdl9maWxlWzFdIDwtIGZpbGUucGF0aChkaXJuYW1lKGNzdl9maWxlWzFdKSwgYmFzZW5hbWUoY3N2X2ZpbGVbMV0pKQppZiAoIWZpbGUuZXhpc3RzKGNzdl9maWxlWzFdKSkgewogIHN0b3AoIkZpbGUgZG9lcyBub3QgZXhpc3QuIENoZWNrIHRoZSBwYXRoLiIpCn0KCnByaW50KGNzdl9maWxlKQpgYGAKCiMgU2VsZWN0IGZpcnN0IENTViBmaWxlCgpgYGB7ciBsb2FkLWNzdi1maWxlfQojIFJlYWQgdGhlIE1hcmtkb3duIGZpbGUKWm90ZXJvX3RhZ19leHBvcnRfbG9uZyA8LSByZWFkLmNzdihjc3ZfZmlsZVsxXSwgZW5jb2RpbmcgPSAiVVRGLTgiKQoKIyBDaGVjayBpZiB0aGUgZmlsZSBpcyBlbXB0eQppZiAobGVuZ3RoKFpvdGVyb190YWdfZXhwb3J0X2xvbmcpID09IDApIHsKICBzdG9wKCJFcnJvcjogVGhlIGNzdiBmaWxlIGlzIGVtcHR5LiIpCn0KCmBgYAoKIyMjIyMjIyMjIyBvd24gY29kaW5nCgoKYGBge3IgcHV0IGluIG9uZSBjb2x1bW59Cgpab3Rlcm9fdGFnX2V4cG9ydF9sb25nIDwtIFpvdGVyb190YWdfZXhwb3J0X2xvbmcgJT4lCiAgIyBSZW1vdmUgYmFja3NsYXNoZXMgZnJvbSB0aGUgJ3RhZycgY29sdW1uCiAgbXV0YXRlKHRhZyA9IGdzdWIoIlxcXFwiLCAiIiwgdGFnKSkgJT4lCiAgIyBVcGRhdGUgdGhlIGFubm90YXRpb24gY29sdW1uIGJ5IGNvbWJpbmluZyBleGlzdGluZyBhbm5vdGF0aW9uLCBjb21tZW50IChpZiBhcHBsaWNhYmxlKSwgYW5kIHBhZ2UgaW5mbwogIG11dGF0ZShhbm5vdGF0aW9uID0gc3RyX3NxdWlzaCgKICAgIHBhc3RlKAogICAgICBpZl9lbHNlKGlzLm5hKGFubm90YXRpb24pLCAiIiwgYW5ub3RhdGlvbiksCiAgICAgIGlmX2Vsc2UoY29tbWVudCAhPSAiTm8gQ29tbWVudCIsIGNvbW1lbnQsICIiKSwKICAgICAgcGFzdGUwKCIocC4iLCBwYWdlLCAiKSIpCiAgICApCiAgKSkgJT4lCiAgIyBSZW1vdmUgdGhlIHJlZHVuZGFudCBwYWdlIGFuZCBjb21tZW50IGNvbHVtbnMKICBzZWxlY3QoLXBhZ2UsIC1jb21tZW50KQoKIyBWaWV3IHRoZSB1cGRhdGVkIGRhdGFmcmFtZQpwcmludChab3Rlcm9fdGFnX2V4cG9ydF9sb25nKQoKCmBgYAoKCgpgYGB7ciBwaXZvdCB0YWJsZX0KClpvdGVyb19TeW50aGVzaXNUYWJsZSA8LSBab3Rlcm9fdGFnX2V4cG9ydF9sb25nICU+JQogIHBpdm90X3dpZGVyKAogICAgaWRfY29scyA9IGModGl0bGUsIGF1dGhvciksCiAgICBuYW1lc19mcm9tID0gdGFnLAogICAgdmFsdWVzX2Zyb20gPSBhbm5vdGF0aW9uLAogICAgdmFsdWVzX2ZuID0gZnVuY3Rpb24oeCkgewogICAgICBpZihsZW5ndGgoeCkgPT0gMSkgewogICAgICAgIHgKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXN0ZTAoJyInLCBwYXN0ZSh4LCBjb2xsYXBzZSA9ICciICInKSwgJyInKQogICAgICB9CiAgICB9CiAgKSAlPiUKICBzZWxlY3QodGl0bGUsIGF1dGhvciwgZXZlcnl0aGluZygpKQoKIyBWaWV3IHRoZSB0cmFuc2Zvcm1lZCBkYXRhZnJhbWUKcHJpbnQoWm90ZXJvX1N5bnRoZXNpc1RhYmxlKQoKYGBgCgoKIyMjIyMgc3RvcmFnZSBhbmQgY2xlYW5pbmcKCiMgVXBsb2FkIFpvdGVybyB0YWcgZXhwb3J0IGxvbmcgZGF0YSBmaWxlIHRvIE9TRgojIyBTYXZlIFpvdGVybyB0YWcgZXhwb3J0IGxvbmcgZGF0YSBmcmFtZSB0byBsb2NhbCBwcm9jZXNzZWRfZGF0YV9kaXIgZm9sZGVyCmBgYHtyIHNhdmVfZGF0YX0KCiMgRGVmaW5lIHRoZSBmdWxsIHBhdGggZm9yIHRoZSBvdXRwdXQgQ1NWIGZpbGUKb3V0cHV0X2ZpbGUgPC0gZmlsZS5wYXRoKHByb2Nlc3NlZF9kYXRhX2RpciwgIlpvdGVyb19TeW50aGVzaXNUYWJsZS5jc3YiKQoKd3JpdGUuY3N2KFpvdGVyb19TeW50aGVzaXNUYWJsZSxvdXRwdXRfZmlsZSxyb3cubmFtZXM9RkFMU0UpCmBgYAoKIyMgVXBsb2FkIFpvdGVybyB0YWcgZXhwb3J0IGxvbmcgZmlsZSBmcm9tIGxvY2FsIHByb2Nlc3NlZF9kYXRhX2RpciB0byBmb2xkZXIgdG8gT1NGCmBgYHtyIGZpbGUtdG8tb3NmLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQoKIyBMaXN0IGFsbCBDU1YgZmlsZXMgaW4gcHJvY2Vzc2VkX2RhdGFfZGlyCmNzdl9maWxlcyA8LSBsaXN0LmZpbGVzKHByb2Nlc3NlZF9kYXRhX2RpciwgcGF0dGVybiA9ICJcXC5jc3YkIiwgZnVsbC5uYW1lcyA9IFRSVUUpCgojIHVwbG9hZCB0aGUgZmlyc3QgY3N2IGZpbGUgaWYgdGhlcmUgYXJlIG1hbnkKaWYgKGxlbmd0aChjc3ZfZmlsZXMpID09IDApIHsKICBzdG9wKCJObyBDU1YgZmlsZXMgZm91bmQgaW4gcHJvY2Vzc2VkX2RhdGFfZGlyLiIpCn0gZWxzZSB7CiAgZmlsZV90b191cGxvYWQgPC0gY3N2X2ZpbGVzWzFdCn0KCgojIFJldHJpZXZlIHRoZSBwcm9jZXNzZWRfZGF0YSBub2RlJ3MgbWV0YSBkYXRhIGZyb20gT1NGCiMgIyMgUHJvY2Vzc2VkX2RhdGEgTm9kZSBPU0YgcHJvamVjdDogTWFzdGVyIFRoZXNpczogaHR0cHM6Ly9vc2YuaW8vZTRyZGgvCiMgQXJ0IHByb2plY3QgaHR0cHM6Ly9vc2YuaW8vYWtnZjIvCnByb2NkYXRhPC0gb3NmX3JldHJpZXZlX25vZGUocHJvY2Vzc2VkX2RhdGFfbm9kZV9pZCkKb3NmX3VwbG9hZChwcm9jZGF0YSwgcGF0aCA9IGZpbGVfdG9fdXBsb2FkLCBjb25mbGljdHMgPSAib3ZlcndyaXRlIikKCmBgYAoKIyBIb3VzZWtlZXBpbmcKCiMjIERlbGV0ZSBmaWxlcyBpbiBsb2NhbCB0ZW1wIGZvbGRlcgpgYGB7ciBSZW1vdmUtbG9jYWwtdGVtcC1maWxlcyx3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCAgbWVzc2FnZT1GQUxTRSxldmFsPVRSVUV9CiMgUGF0dGVybiB0byBtYXRjaCAoZS5nLiBhbGwgZmlsZXMgdGhhdCBzdGFydCB3aXRoICJTTFJfIikKIyBmaWxlX3BhdHRlcm4gPC0gIl5TTFJfLioiCiBmaWxlX3BhdHRlcm4gPC0gIiouKiIKCiMgTGlzdCBhbGwgZmlsZXMgaW4gdGVtcCBkaXJlY3RvcmllcyB0aGF0IG1hdGNoIHRoaXMgcGF0dGVybgpyYXdfZGF0YV9kaXJfZmlsZXMgPC0gbGlzdC5maWxlcygKICBwYXRoID0gcmF3X2RhdGFfZGlyLAogIHBhdHRlcm4gPSBmaWxlX3BhdHRlcm4sCiAgZnVsbC5uYW1lcyA9IFRSVUUKKQoKcHJvY2Vzc2VkX2RhdGFfZGlyX2ZpbGVzIDwtIGxpc3QuZmlsZXMoCiAgcGF0aCA9IHByb2Nlc3NlZF9kYXRhX2RpciwKICBwYXR0ZXJuID0gZmlsZV9wYXR0ZXJuLAogIGZ1bGwubmFtZXMgPSBUUlVFCikKCiMgUmVtb3ZlIHRoZW0KZmlsZS5yZW1vdmUocmF3X2RhdGFfZGlyX2ZpbGVzKQpmaWxlLnJlbW92ZShwcm9jZXNzZWRfZGF0YV9kaXJfZmlsZXMpCgpgYGAKCiMjIERlbGV0ZSBsb2NhbCBkaXJlY3RvcmllcwpgYGB7ciBkZWxldGUtdGVtcC1kaXJlY3Rvcmllc30KIyBEZWxldGUgdGhlIHJhd19kYXRhX2RpciBkaXJlY3RvcnkgYW5kIGl0cyBjb250ZW50cwojIHVubGluayhmaWxlLnBhdGgodGVtcGRpcigpLCAicmF3X2RhdGFfZGlyIiksIHJlY3Vyc2l2ZSA9IFRSVUUpCnVubGluayhyYXdfZGF0YV9kaXIsIHJlY3Vyc2l2ZSA9IFRSVUUpCgojIERlbGV0ZSB0aGUgcHJvY2Vzc2VkX2RhdGFfZGlyIGRpcmVjdG9yeSBhbmQgaXRzIGNvbnRlbnRzCiMgdW5saW5rKGZpbGUucGF0aCh0ZW1wZGlyKCksICJwcm9jZXNzZWRfZGF0YV9kaXIiKSwgcmVjdXJzaXZlID0gVFJVRSkKdW5saW5rKHByb2Nlc3NlZF9kYXRhX2RpciwgcmVjdXJzaXZlID0gVFJVRSkKCmBgYAoKCg==